package com.hainatong.shiphelper.dbtoolroom;


import androidx.annotation.NonNull;
import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import androidx.room.migration.Migration;
import androidx.sqlite.db.SupportSQLiteDatabase;
import com.hainatong.shiphelper.App;

/**
 * @author  使用Room 第3步 建 DataBase
 * @date
 * @description
 * 改变数据库结构要改变版本号,不然会抛异常！
 * version = 3 更新积分和排名字段
 * 每更改一次版本，注意更改 new Migration(2, 3)部分
 *
 * Database 是Room数据库对象。entities属性指定该库有哪些表，若需建立多张表，以逗号相隔开。
 * version指定库版本号，后续升级依据版本号判断。该类需要继承自RoomDatabase
 * 在类中，通过Room.databaseBuilder()结合单例设计模式，完成数据库的创建工作。
 * 另外，我们创建的Dao对象，在这里以抽象方法的形式返回，只需一行代码即可。
 */
@Database(entities = {User.class}, version = 3, exportSchema = false)
public abstract class DBUtils extends RoomDatabase
{
    private static final String DATABASE_NAME = "MvvmDemo.db";

    private static DBUtils sInstance;

    public abstract UserDao userDao();

    //public abstract StudentDao studentDao();

    /**
     * 版本号迁移：
     * http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2017/0728/8278.html
     */
    static final Migration MIGRATION_1_2 = new Migration(1, 2)
    {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database)
        {
            // Since we didn't alter the table, there's nothing else to do here.
        }
    };

    private static final Migration MIGRATION_2_3 = new Migration(2, 3)
    {
        @Override
        public void migrate(SupportSQLiteDatabase database)
        {
            // 此处对于数据库中的所有更新都需要写下面的代码
            database.execSQL("ALTER TABLE 'User' ADD COLUMN 'coinCount' INT NOT NULL DEFAULT 0");
            database.execSQL("ALTER TABLE 'User' ADD COLUMN 'rank' INT NOT NULL DEFAULT 0");
        }
    };

    public static DBUtils getDatabase()
    {
        if (sInstance == null)
        {
            sInstance = Room.databaseBuilder(App.getInstance(), DBUtils.class, DATABASE_NAME)
                    .addMigrations(MIGRATION_2_3)
                    .build();
        }
        return sInstance;
    }

    public static void onDestroy()
    {
        sInstance = null;
    }

}
